package br.requisiteworks.requisito.modelo.service;

import java.util.List;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import br.requisiteworks.requisito.modelo.TipoRequisito;
import br.requisiteworks.requisito.modelo.dao.TipoRequisitoDao;
import br.requisiteworks.util.persistencia.ErroBancoDados;
import br.requisiteworks.util.persistencia.ResultadoVazio;

@Service
public class TipoRequisitoService {

	/**
	 * Log da classe
	 */
	private static final Log log = LogFactory
			.getLog(TipoRequisitoService.class);

	@Autowired
	private TipoRequisitoDao tipoRequisitoDao;

	/**
	 * Salva um novo {@link TipoRequisito} ao repositorio de dados
	 * 
	 * @param tipoRequisito
	 *            o {@link TipoRequisito} a ser adicionado ao repositorio
	 * @throws ErroBancoDados
	 *             Caso ocorra algum erro durante a persistencia do
	 *             {@link TipoRequisito}
	 */
	public void salvarTipoRequisito(TipoRequisito tipoRequisito)
			throws ErroBancoDados {
		this.tipoRequisitoDao.insert(tipoRequisito);
		log.info("Atributo de requisito adicionado com sucesso: "
				+ tipoRequisito);
	}

	/**
	 * Atualiza um {@link TipoRequisito} existente no repositorio de dados
	 * 
	 * @param tipoRequisito
	 *            o {@link TipoRequisito} a ser atualizado
	 * @throws ErroBancoDados
	 *             Caso ocorra algum erro durante a persistencia do
	 *             {@link TipoRequisito}
	 */
	public void atualizarTipoRequisito(TipoRequisito tipoRequisito)
			throws ErroBancoDados {
		this.tipoRequisitoDao.update(tipoRequisito);
		log.info("Atributo de requisito atualizado com sucesso: "
				+ tipoRequisito);
	}

	/**
	 * Busca no repositorio por todos os {@link TipoRequisito}s cadastrados no
	 * sistema
	 * 
	 * @throws ResultadoVazio
	 *             Caso nenhum {@link TipoRequisito} seja encontrado
	 */
	public List<TipoRequisito> listarTipoRequisito() throws ResultadoVazio {
		return this.tipoRequisitoDao.select();
	}

	/**
	 * Busca no repositorio um {@link TipoRequisito} cujo numero seja igual ao
	 * parametro passado
	 * 
	 * @param numero
	 *            O numero de identificacao do {@link TipoRequisito} no
	 *            repositorio de dados
	 * @throws ResultadoVazio
	 *             Caso um {@link TipoRequisito} nao seja encontrado
	 */
	public TipoRequisito carregarTipoRequisito(int numero)
			throws ResultadoVazio {
		return this.tipoRequisitoDao.select(numero);
	}

	/**
	 * Remove do repositorio o {@link TipoRequisito} passado pelo parametro
	 * 
	 * @param tipoRequisito
	 *            O {@link TipoRequisito} que sera removido do repositorio de
	 *            dados
	 * @throws ErroBancoDados
	 *             Caso ocorra algum erro durante a transacao
	 */
	public void deletaTipoRequisito(TipoRequisito tipoRequisito)
			throws ErroBancoDados {
		this.tipoRequisitoDao.delete(tipoRequisito);
		log.info("Atributo de requisito apagado com sucesso: " + tipoRequisito);
	}
}
